9861. Hotels Along the Croatian Coast

 

There are n hotels along the beautiful Adriatic coast. Each hotel has its value in Euros.

Sroljo has won m Euros on the lottery. Now he wants to buy a sequence of consecutive hotels, such that the sum of the values of these consecutive hotels is as great as possible – but not greater than m.

You are to calculate this greatest possible total value.

 

Input. In the first line there are integers n and m (1 ≤ n ≤ 300 000, 1 ≤ m < 231). In the next line there are n natural numbers less than 106, representing the hotel values in the order they lie along the coast.

 

Output. Print the required number (it will be greater than 0 in all of the test data).

 

Input

Output

5 12

2 1 3 4 5

12

 

 

РЕШЕНИЕ

последовательностискользящее окно

 

Анализ алгоритма

Стоимости отелей занесем в массив a. Интервал [i j] будем называть хорошим, если сумма стоимостей отелей на нем не больше m.

Реализуем скользящее окно при помощи двух индексов i и j и будем его поддерживать так, чтобы текущий рассматриваемый интервал [i j] был хорошим, а интервал [i – 1 … j] плохим. Пусть s – сумма стоимостей отелей на интервале [i j]. Если s + a[j + 1] m, то расширяем текущий интервал до a[i.. j + 1]. Иначе сокращаем его до a[i + 1.. j]. Находим максимум среди стоимостей всех рассматриваемых хороших интервалов.

 

Реализация алгоритма

 

#include <stdio.h>

#define MAX 300010

 

int i, j, n;

long long res, m, s, a[MAX];

 

int main(void)

{

  scanf("%d %lld",&n,&m);

  for (j = 0; j < n; j++)

    scanf("%lld", &a[j]);

 

  s = i = 0;

  for (j = 0; j < n; j++)

  {

    s += a[j];

    while (s > m) s -= a[i++];

    if (s > res) res = s;

  }  

 

  printf("%lld\n",res);

  return 0;

}

 

Реализация алгоритма – STL, queue

 

#include <cstdio>

#include <queue>

using namespace std;

 

int i, j, n;

long long res, m, s, val;

queue<int> q;

 

int main(void)

{

  scanf("%d %lld",&n,&m);

  for (s = i = 0; i < n; i++)

  {

    scanf("%d",&val);

    q.push(val);

    s += val;

 

    while (s > m)

    {

      s -= q.front();

      q.pop();

    }

    if (s > res) res = s;

  }  

 

  printf("%lld\n",res);

  return 0;

}